STM32

您所在的位置:网站首页 stm32 pwm波形不准确 STM32

STM32

2023-06-02 09:04| 来源: 网络整理| 查看: 265

实验要求:输出DAC1通道1(PA4)输出三角波。然后关闭通道1触发(TEN1位置0),关闭输出缓冲(BOFF1位置1),使用12位右对齐模式,将数字量写入DAC_DHR12R1寄存器。

接下来介绍产生三角波的函数。第一个参数为最大值的数字量,取值为0~4095,比如取值2048时候,输出最高值为1.65V;第二个参数为采样点的间隔时间,第三个参数为采样点的数量,而周期为采样点间隔时间 * 采样点的数量;第四个参数是总体产生的波形个数。采样点个数的约束如下:(采样点个数/2) ((maxval + 1) * 2)) return; incval = (maxval + 1) / (samples / 2); for(u16 j = 0; j < n; j++) { curval = 0; HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval); for(u16 i = 0; i < (samples/2); i++) //上升波 { curval += incval; HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval); delay_us(dt); } for(u16 i = 0; i < (samples/2); i++) //下降波 { curval -= incval; HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval); delay_us(dt); } } }

接下来编写主函数的实验代码main.c:

#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./USMART/usmart.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/DAC/dac.h" #include "./BSP/ADC/adc3.h" int main(void) { uint8_t t = 0; uint8_t key; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(72); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ dac_init(1); /* 初始化DAC1_OUT1通道 */ lcd_show_string(30, 50, 200, 16, 16, "STM32", RED); lcd_show_string(30, 70, 200, 16, 16, "DAC Triangular WAVE TEST", RED); lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED); lcd_show_string(30, 110, 200, 16, 16, "KEY0:Wave1 KEY1:Wave2", RED); lcd_show_string(30, 130, 200, 16, 16, "DAC None", BLUE); /* 提示无输出 */ while (1) { t++; key = key_scan(0); /* 按键扫描 */ if (key == KEY0_PRES) /* 高采样率 , 约1Khz波形 */ { lcd_show_string(30, 130, 200, 16, 16, "DAC Wave1 ", BLUE); dac_triangular_wave(4095, 5, 2000, 100); /* 幅值4095, 采样点间隔5us, 200个采样点, 100个波形 */ lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE); } else if (key == KEY1_PRES) /* 低采样率 , 约1Khz波形 */ { lcd_show_string(30, 130, 200, 16, 16, "DAC Wave2 ", BLUE); dac_triangular_wave(4095, 500, 20, 100); /* 幅值4095, 采样点间隔500us, 20个采样点, 100个波形 */ lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE); } if (t == 10) /* 定时时间到了 */ { LED0_TOGGLE(); /* LED0闪烁 */ t = 0; } delay_ms(10); } }

到这里,实验的代码便写完了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3